{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.preprocessing import normalize\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.metrics import accuracy_score\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.metrics import confusion_matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**load the dataset from assignment1**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [],
   "source": [
    "# define the name of headers\n",
    "col_name = ['age','workclass','fnlwgt','education','education-num','marital-status','occupation','relationship','race','sex','capital-gain','capital-loss','hours-per-week','native-country','salary']\n",
    "# read data from csv file\n",
    "persons = pd.read_csv('dataset1_processed.csv',header=None,names = col_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>education-num</th>\n",
       "      <th>marital-status</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>native-country</th>\n",
       "      <th>salary</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>State-gov</td>\n",
       "      <td>77516</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>13</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>2174</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>Self-emp-not-inc</td>\n",
       "      <td>83311</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>13</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38</td>\n",
       "      <td>Private</td>\n",
       "      <td>215646</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>9</td>\n",
       "      <td>Divorced</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>53</td>\n",
       "      <td>Private</td>\n",
       "      <td>234721</td>\n",
       "      <td>11th</td>\n",
       "      <td>7</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28</td>\n",
       "      <td>Private</td>\n",
       "      <td>338409</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>13</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Prof-specialty</td>\n",
       "      <td>Wife</td>\n",
       "      <td>Black</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>Cuba</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age         workclass  fnlwgt  education  education-num  \\\n",
       "0   39         State-gov   77516  Bachelors             13   \n",
       "1   50  Self-emp-not-inc   83311  Bachelors             13   \n",
       "2   38           Private  215646    HS-grad              9   \n",
       "3   53           Private  234721       11th              7   \n",
       "4   28           Private  338409  Bachelors             13   \n",
       "\n",
       "       marital-status         occupation   relationship   race     sex  \\\n",
       "0       Never-married       Adm-clerical  Not-in-family  White    Male   \n",
       "1  Married-civ-spouse    Exec-managerial        Husband  White    Male   \n",
       "2            Divorced  Handlers-cleaners  Not-in-family  White    Male   \n",
       "3  Married-civ-spouse  Handlers-cleaners        Husband  Black    Male   \n",
       "4  Married-civ-spouse     Prof-specialty           Wife  Black  Female   \n",
       "\n",
       "   capital-gain  capital-loss  hours-per-week native-country salary  \n",
       "0          2174             0              40  United-States  <=50K  \n",
       "1             0             0              13  United-States  <=50K  \n",
       "2             0             0              40  United-States  <=50K  \n",
       "3             0             0              40  United-States  <=50K  \n",
       "4             0             0              40           Cuba  <=50K  "
      ]
     },
     "execution_count": 220,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "persons.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**convert categorical columns into multiple binary or numerical columns**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**The values of education feature is ordinal, so convert them into numerical values**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {},
   "outputs": [],
   "source": [
    "#refer to https://towardsdatascience.com/preprocessing-with-sklearn-a-complete-and-comprehensive-guide-670cb98fcfb9\n",
    "edu = pd.Categorical(persons['education'],categories=['Preschool','1st-4th','5th-6th','7th-8th','9th','10th','11th','12th','HS-grad','Prof-school','Assoc-acdm','Assoc-voc','Some-college','Bachelors','Masters','Doctorate'],ordered=True)\n",
    "labels, unique = pd.factorize(edu, sort=True)\n",
    "persons['education'] = labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8     9457\n",
       "12    6400\n",
       "13    4859\n",
       "14    1559\n",
       "11    1257\n",
       "6      996\n",
       "10     962\n",
       "5      794\n",
       "3      531\n",
       "9      517\n",
       "4      440\n",
       "15     364\n",
       "7      361\n",
       "2      276\n",
       "1      141\n",
       "0       44\n",
       "Name: education, dtype: int64"
      ]
     },
     "execution_count": 222,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "persons['education'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**The other categorial features('workclass','marital-status','occupation','relationship','race','sex','native-country') are nominal,using get_dummies to convert them into multiple binary values. **"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [],
   "source": [
    "#get all the data columns except target value 'salary' for get_dummies process\n",
    "data = persons.loc[:, persons.columns != 'salary']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>education-num</th>\n",
       "      <th>marital-status</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>native-country</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>State-gov</td>\n",
       "      <td>77516</td>\n",
       "      <td>13</td>\n",
       "      <td>13</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>2174</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>Self-emp-not-inc</td>\n",
       "      <td>83311</td>\n",
       "      <td>13</td>\n",
       "      <td>13</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38</td>\n",
       "      <td>Private</td>\n",
       "      <td>215646</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>Divorced</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>53</td>\n",
       "      <td>Private</td>\n",
       "      <td>234721</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28</td>\n",
       "      <td>Private</td>\n",
       "      <td>338409</td>\n",
       "      <td>13</td>\n",
       "      <td>13</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Prof-specialty</td>\n",
       "      <td>Wife</td>\n",
       "      <td>Black</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>Cuba</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age         workclass  fnlwgt  education  education-num  \\\n",
       "0   39         State-gov   77516         13             13   \n",
       "1   50  Self-emp-not-inc   83311         13             13   \n",
       "2   38           Private  215646          8              9   \n",
       "3   53           Private  234721          6              7   \n",
       "4   28           Private  338409         13             13   \n",
       "\n",
       "       marital-status         occupation   relationship   race     sex  \\\n",
       "0       Never-married       Adm-clerical  Not-in-family  White    Male   \n",
       "1  Married-civ-spouse    Exec-managerial        Husband  White    Male   \n",
       "2            Divorced  Handlers-cleaners  Not-in-family  White    Male   \n",
       "3  Married-civ-spouse  Handlers-cleaners        Husband  Black    Male   \n",
       "4  Married-civ-spouse     Prof-specialty           Wife  Black  Female   \n",
       "\n",
       "   capital-gain  capital-loss  hours-per-week native-country  \n",
       "0          2174             0              40  United-States  \n",
       "1             0             0              13  United-States  \n",
       "2             0             0              40  United-States  \n",
       "3             0             0              40  United-States  \n",
       "4             0             0              40           Cuba  "
      ]
     },
     "execution_count": 224,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 225,
   "metadata": {},
   "outputs": [],
   "source": [
    "# use get_dummies method to convert other categorial features to binary values\n",
    "# refer to https://towardsdatascience.com/encoding-categorical-features-21a2651a065c\n",
    "data_dummies = pd.get_dummies(data, prefix_sep='_', drop_first=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 226,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>education-num</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>workclass_Local-gov</th>\n",
       "      <th>workclass_Private</th>\n",
       "      <th>workclass_Self-emp-inc</th>\n",
       "      <th>...</th>\n",
       "      <th>native-country_Portugal</th>\n",
       "      <th>native-country_Puerto-Rico</th>\n",
       "      <th>native-country_Scotland</th>\n",
       "      <th>native-country_South</th>\n",
       "      <th>native-country_Taiwan</th>\n",
       "      <th>native-country_Thailand</th>\n",
       "      <th>native-country_Trinadad&amp;Tobago</th>\n",
       "      <th>native-country_United-States</th>\n",
       "      <th>native-country_Vietnam</th>\n",
       "      <th>native-country_Yugoslavia</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>77516</td>\n",
       "      <td>13</td>\n",
       "      <td>13</td>\n",
       "      <td>2174</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>83311</td>\n",
       "      <td>13</td>\n",
       "      <td>13</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38</td>\n",
       "      <td>215646</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>53</td>\n",
       "      <td>234721</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28</td>\n",
       "      <td>338409</td>\n",
       "      <td>13</td>\n",
       "      <td>13</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 82 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  fnlwgt  education  education-num  capital-gain  capital-loss  \\\n",
       "0   39   77516         13             13          2174             0   \n",
       "1   50   83311         13             13             0             0   \n",
       "2   38  215646          8              9             0             0   \n",
       "3   53  234721          6              7             0             0   \n",
       "4   28  338409         13             13             0             0   \n",
       "\n",
       "   hours-per-week  workclass_Local-gov  workclass_Private  \\\n",
       "0              40                    0                  0   \n",
       "1              13                    0                  0   \n",
       "2              40                    0                  1   \n",
       "3              40                    0                  1   \n",
       "4              40                    0                  1   \n",
       "\n",
       "   workclass_Self-emp-inc  ...  native-country_Portugal  \\\n",
       "0                       0  ...                        0   \n",
       "1                       0  ...                        0   \n",
       "2                       0  ...                        0   \n",
       "3                       0  ...                        0   \n",
       "4                       0  ...                        0   \n",
       "\n",
       "   native-country_Puerto-Rico  native-country_Scotland  native-country_South  \\\n",
       "0                           0                        0                     0   \n",
       "1                           0                        0                     0   \n",
       "2                           0                        0                     0   \n",
       "3                           0                        0                     0   \n",
       "4                           0                        0                     0   \n",
       "\n",
       "   native-country_Taiwan  native-country_Thailand  \\\n",
       "0                      0                        0   \n",
       "1                      0                        0   \n",
       "2                      0                        0   \n",
       "3                      0                        0   \n",
       "4                      0                        0   \n",
       "\n",
       "   native-country_Trinadad&Tobago  native-country_United-States  \\\n",
       "0                               0                             1   \n",
       "1                               0                             1   \n",
       "2                               0                             1   \n",
       "3                               0                             1   \n",
       "4                               0                             0   \n",
       "\n",
       "   native-country_Vietnam  native-country_Yugoslavia  \n",
       "0                       0                          0  \n",
       "1                       0                          0  \n",
       "2                       0                          0  \n",
       "3                       0                          0  \n",
       "4                       0                          0  \n",
       "\n",
       "[5 rows x 82 columns]"
      ]
     },
     "execution_count": 226,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_dummies.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Normalize the numeric features**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 227,
   "metadata": {},
   "outputs": [],
   "source": [
    "# retrive all the numerical columns\n",
    "data_numerical = data_dummies[['age','fnlwgt','education','education-num','capital-gain','capital-loss','hours-per-week']]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 228,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_normalize = data_dummies\n",
    "# normalize every numerical columns in for loop using normalize() method\n",
    "for col in data_numerical.columns:\n",
    "    x = np.array(data_numerical[col])\n",
    "    y = normalize([x]) \n",
    "    data_normalize[col] = y[0].tolist()   \n",
    "   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 229,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>education-num</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>workclass_Local-gov</th>\n",
       "      <th>workclass_Private</th>\n",
       "      <th>workclass_Self-emp-inc</th>\n",
       "      <th>...</th>\n",
       "      <th>native-country_Portugal</th>\n",
       "      <th>native-country_Puerto-Rico</th>\n",
       "      <th>native-country_Scotland</th>\n",
       "      <th>native-country_South</th>\n",
       "      <th>native-country_Taiwan</th>\n",
       "      <th>native-country_Thailand</th>\n",
       "      <th>native-country_Trinadad&amp;Tobago</th>\n",
       "      <th>native-country_United-States</th>\n",
       "      <th>native-country_Vietnam</th>\n",
       "      <th>native-country_Yugoslavia</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.005661</td>\n",
       "      <td>0.002098</td>\n",
       "      <td>0.007369</td>\n",
       "      <td>0.007318</td>\n",
       "      <td>0.001687</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005510</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.007258</td>\n",
       "      <td>0.002255</td>\n",
       "      <td>0.007369</td>\n",
       "      <td>0.007318</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001791</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.005516</td>\n",
       "      <td>0.005836</td>\n",
       "      <td>0.004535</td>\n",
       "      <td>0.005066</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005510</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007694</td>\n",
       "      <td>0.006352</td>\n",
       "      <td>0.003401</td>\n",
       "      <td>0.003940</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005510</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.004065</td>\n",
       "      <td>0.009158</td>\n",
       "      <td>0.007369</td>\n",
       "      <td>0.007318</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005510</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 82 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        age    fnlwgt  education  education-num  capital-gain  capital-loss  \\\n",
       "0  0.005661  0.002098   0.007369       0.007318      0.001687           0.0   \n",
       "1  0.007258  0.002255   0.007369       0.007318      0.000000           0.0   \n",
       "2  0.005516  0.005836   0.004535       0.005066      0.000000           0.0   \n",
       "3  0.007694  0.006352   0.003401       0.003940      0.000000           0.0   \n",
       "4  0.004065  0.009158   0.007369       0.007318      0.000000           0.0   \n",
       "\n",
       "   hours-per-week  workclass_Local-gov  workclass_Private  \\\n",
       "0        0.005510                    0                  0   \n",
       "1        0.001791                    0                  0   \n",
       "2        0.005510                    0                  1   \n",
       "3        0.005510                    0                  1   \n",
       "4        0.005510                    0                  1   \n",
       "\n",
       "   workclass_Self-emp-inc  ...  native-country_Portugal  \\\n",
       "0                       0  ...                        0   \n",
       "1                       0  ...                        0   \n",
       "2                       0  ...                        0   \n",
       "3                       0  ...                        0   \n",
       "4                       0  ...                        0   \n",
       "\n",
       "   native-country_Puerto-Rico  native-country_Scotland  native-country_South  \\\n",
       "0                           0                        0                     0   \n",
       "1                           0                        0                     0   \n",
       "2                           0                        0                     0   \n",
       "3                           0                        0                     0   \n",
       "4                           0                        0                     0   \n",
       "\n",
       "   native-country_Taiwan  native-country_Thailand  \\\n",
       "0                      0                        0   \n",
       "1                      0                        0   \n",
       "2                      0                        0   \n",
       "3                      0                        0   \n",
       "4                      0                        0   \n",
       "\n",
       "   native-country_Trinadad&Tobago  native-country_United-States  \\\n",
       "0                               0                             1   \n",
       "1                               0                             1   \n",
       "2                               0                             1   \n",
       "3                               0                             1   \n",
       "4                               0                             0   \n",
       "\n",
       "   native-country_Vietnam  native-country_Yugoslavia  \n",
       "0                       0                          0  \n",
       "1                       0                          0  \n",
       "2                       0                          0  \n",
       "3                       0                          0  \n",
       "4                       0                          0  \n",
       "\n",
       "[5 rows x 82 columns]"
      ]
     },
     "execution_count": 229,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_normalize.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Split the data into 2 parts: train and validation**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 232,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = data_normalize\n",
    "y = persons['salary']\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)\n",
    "accuracy = pd.DataFrame(columns=['train_accuracy','train_average_class_accuracy','test_accuracy','test_average_class_accuracy'])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Train at least 3 different machine learning classification algorithms and evaluate their accuracy**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 233,
   "metadata": {},
   "outputs": [],
   "source": [
    "# def a method to calculate the average class accuracy\n",
    "def average_class_accuracy (actual, predict):\n",
    "    cm = confusion_matrix(actual, predict, labels=['<=50K','>50K'])\n",
    "    tp = cm[0][0]\n",
    "    tn = cm[1][1]\n",
    "    less50class = np.sum(cm[0])\n",
    "    greater50class = np.sum(cm[1])\n",
    "    less50class_accuracy = tp/less50class\n",
    "    greater50class_accuracy = tn/greater50class\n",
    "    average_class_accuracy = (less50class_accuracy+greater50class_accuracy)/2\n",
    "    return average_class_accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 234,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "train_accuracy                  0.999951\n",
       "train_average_class_accuracy    0.999901\n",
       "test_accuracy                   0.816874\n",
       "test_average_class_accuracy     0.756628\n",
       "Name: DecisionTreeClassfier, dtype: float64"
      ]
     },
     "execution_count": 234,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#DecisionTreeClassfier\n",
    "dtc = DecisionTreeClassifier()\n",
    "dtc.fit(X_train,y_train)\n",
    "#accuracy on train data \n",
    "train_pre = dtc.predict(X_train)\n",
    "train_accuracy = accuracy_score(y_train, train_pre)\n",
    "train_average_class_accuracy = average_class_accuracy(y_train, train_pre)\n",
    "#accuracy on test data\n",
    "predictions = dtc.predict(X_test)\n",
    "dtc_accuracy = accuracy_score(y_test, predictions)\n",
    "test_average_class_accuracy = average_class_accuracy(y_test, predictions)\n",
    "accuracy.loc['DecisionTreeClassfier'] = [train_accuracy,train_average_class_accuracy,dtc_accuracy,test_average_class_accuracy]\n",
    "accuracy.loc['DecisionTreeClassfier'] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 235,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "train_accuracy                  0.875728\n",
       "train_average_class_accuracy    0.814551\n",
       "test_accuracy                   0.825737\n",
       "test_average_class_accuracy     0.741632\n",
       "Name: KNeighborsClassifier, dtype: float64"
      ]
     },
     "execution_count": 235,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#KNeighborsClassifier\n",
    "knc = KNeighborsClassifier()\n",
    "knc.fit(X_train,y_train)\n",
    "#accuracy on train data \n",
    "train_pre = knc.predict(X_train)\n",
    "train_accuracy = accuracy_score(y_train, train_pre)\n",
    "train_average_class_accuracy = average_class_accuracy(y_train, train_pre)\n",
    "#accuracy on test data\n",
    "predictions = knc.predict(X_test)\n",
    "knc_accuracy = accuracy_score(y_test, predictions)\n",
    "test_average_class_accuracy = average_class_accuracy(y_test, predictions)\n",
    "accuracy.loc['KNeighborsClassifier'] = [train_accuracy,train_average_class_accuracy,knc_accuracy,test_average_class_accuracy]\n",
    "accuracy.loc['KNeighborsClassifier']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 236,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "train_accuracy                  0.553675\n",
       "train_average_class_accuracy    0.688022\n",
       "test_accuracy                   0.550299\n",
       "test_average_class_accuracy     0.682287\n",
       "Name: GaussianNB, dtype: float64"
      ]
     },
     "execution_count": 236,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#GaussianNB\n",
    "gnb = GaussianNB()\n",
    "gnb.fit(X_train,y_train)\n",
    "#accuracy on train data \n",
    "train_pre = gnb.predict(X_train)\n",
    "train_accuracy = accuracy_score(y_train, train_pre)\n",
    "train_average_class_accuracy = average_class_accuracy(y_train, train_pre)\n",
    "#accuracy on test data\n",
    "predictions = gnb.predict(X_test)\n",
    "gnb_accuracy = accuracy_score(y_test, predictions)\n",
    "test_average_class_accuracy = average_class_accuracy(y_test, predictions)\n",
    "accuracy.loc['GaussianNB'] = [train_accuracy,train_average_class_accuracy,gnb_accuracy,test_average_class_accuracy]\n",
    "accuracy.loc['GaussianNB']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 237,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "train_accuracy                  0.861470\n",
       "train_average_class_accuracy    0.811787\n",
       "test_accuracy                   0.840585\n",
       "test_average_class_accuracy     0.775349\n",
       "Name: MLPClassifier, dtype: float64"
      ]
     },
     "execution_count": 237,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#MLPClassifier\n",
    "mlpc = MLPClassifier()\n",
    "mlpc.fit(X_train,y_train)\n",
    "#accuracy on train data \n",
    "train_pre = mlpc.predict(X_train)\n",
    "train_accuracy = accuracy_score(y_train, train_pre)\n",
    "train_average_class_accuracy = average_class_accuracy(y_train, train_pre)\n",
    "#accuracy on test data\n",
    "predictions = mlpc.predict(X_test)\n",
    "mlpc_accuracy = accuracy_score(y_test, predictions)\n",
    "test_average_class_accuracy = average_class_accuracy(y_test, predictions)\n",
    "accuracy.loc['MLPClassifier'] = [train_accuracy,train_average_class_accuracy,mlpc_accuracy,test_average_class_accuracy]\n",
    "accuracy.loc['MLPClassifier']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 238,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "train_accuracy                  0.812679\n",
       "train_average_class_accuracy    0.736156\n",
       "test_accuracy                   0.813191\n",
       "test_average_class_accuracy     0.730497\n",
       "Name: SVC, dtype: float64"
      ]
     },
     "execution_count": 238,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#SVC\n",
    "svc = SVC(gamma='auto')\n",
    "svc.fit(X_train,y_train)\n",
    "predictions = svc.predict(X_test)\n",
    "#accuracy on train data \n",
    "train_pre = svc.predict(X_train)\n",
    "train_accuracy = accuracy_score(y_train, train_pre)\n",
    "train_average_class_accuracy = average_class_accuracy(y_train, train_pre)\n",
    "#accuracy on test data\n",
    "svc_accuracy = accuracy_score(y_test, predictions)\n",
    "test_average_class_accuracy = average_class_accuracy(y_test, predictions)\n",
    "accuracy.loc['SVC'] = [train_accuracy,train_average_class_accuracy,svc_accuracy,test_average_class_accuracy]\n",
    "accuracy.loc['SVC']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Report the accuracy and the average class accuracy on training and validation sets.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 239,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                       train_accuracy  train_average_class_accuracy  \\\n",
      "MLPClassifier                0.861470                      0.811787   \n",
      "KNeighborsClassifier         0.875728                      0.814551   \n",
      "DecisionTreeClassfier        0.999951                      0.999901   \n",
      "SVC                          0.812679                      0.736156   \n",
      "GaussianNB                   0.553675                      0.688022   \n",
      "\n",
      "                       test_accuracy  test_average_class_accuracy  \n",
      "MLPClassifier               0.840585                     0.775349  \n",
      "KNeighborsClassifier        0.825737                     0.741632  \n",
      "DecisionTreeClassfier       0.816874                     0.756628  \n",
      "SVC                         0.813191                     0.730497  \n",
      "GaussianNB                  0.550299                     0.682287  \n"
     ]
    }
   ],
   "source": [
    "accuracy.sort_values(by=['test_accuracy'], inplace=True, ascending=False)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Plot one bar graph to compare these results for each algorithm. Discuss the results.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x2bc24e305c0>"
      ]
     },
     "execution_count": 240,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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jx49aN26NZ06deKDDz4AYMCAAVx99dV06dKF6667jrfeeovjjjuOli1bctxxx/Hhhx+m2zrvvPPIy8ujT58+tGvXjtmzZwMwbdo0OnToQKtWrejduzdr164ts+5Zs2Zx3HHHkUqlaNu2LWvWrNnqeFn9z5s3j7Zt29KiRQvy8vKYP38+X331FaeddhqpVIrmzZszadKkMvu95ZZbyM/Pp3nz5gwePJiiBZ/h448/5sc//jGpVIpWrVqxYMECAO6++25yc3NJpVIMHz4cgM6dO6evedmyZeTk5AAwfvx4evfuzRlnnEG3bt1Yu3YtXbt2pVWrVuTm5vL888+n63j00UfJy8sjlUpxwQUXsGbNGpo2bcqGDRsAWL16NTk5Oent3cVpcpIkScqYO++8k7lz5zJnzhymT5/Oaaedxty5c2natCkA48aNIzs7m6+//pr8/Hx69epFgwYNtmpj/vz5PPHEE4wdO5bzzjuPZ555hv79+5fa3znnnMOgQYMAGDFiBA8//DBXXHEFqVSKv/71r3Tp0oUXXniB7t27U716dQYPHszo0aM58sgjefPNNxkyZAivvPIKAB999BEFBQVkZWWxevVqZsyYQbVq1SgoKOAXv/gFzzzzDA888AD169fnnXfeYe7cubRo0QIoCgW33XYbBQUF1KlTh7vuuotRo0YxcuTI7Wr+9ttv6dOnD5MmTSI/P5/Vq1dTq1atrc45+uijS+1/9OjRDBs2jH79+vHtt9+yadMmpk6dyiGHHMKUKVMAWLVqVZl/P5dffnm6pgsuuIA//elPnHHGGfTr14/hw4dz9tlns379ejZv3syLL77Ic889x5tvvknt2rVZsWJFuX//b7zxBu+88w7Z2dls3LiRZ599lgMPPJBly5bRvn17evbsyXvvvcftt9/O66+/TsOGDVmxYgV169alc+fOTJkyhbPOOosnn3ySXr16Ub169XL73BmGIUmSJFWatm3bpoMQwH333cezzz4LwGeffcb8+fO3C0NNmzZNh4zWrVuzaNGiMtufO3cuI0aMYOXKlaxdu5bu3bsDpMNGly5dePLJJxkyZAhr167l73//O717905//5tvvkl/7t27N1lZWUBRoLjooouYP38+IYT0CMVrr73GsGHDAGjevDl5eXkAzJw5k/fee4+OHTsCRYGnQ4cOpdb84Ycf0rhxY/Lz8wE48MADtzunrP47dOjA7bffzuLFiznnnHM48sgjyc3N5ZprruG6667j9NNPp1OnTmXer1dffZW7776bdevWsWLFCpo1a0bnzp35/PPPOfvsswGoWbMmAAUFBQwcOJDatWsDkJ2dXWa7W5x88snp82KM/OIXv2DGjBnst99+fP7553zxxRe88sornHvuuTRs2HCrdi+55BLuvvtuzjrrLB555BHGjh1bbn87yzAkSZKkSlOnTp305+nTp1NQUMAbb7xB7dq16dy5M+vXr9/uO/vvv3/6c1ZW1g6nyQ0YMIDnnnuOVCrF+PHjmT59OgA9e/bk+uuvZ8WKFRQWFnLSSSfx1VdfcdBBBzFnzpxya73xxhvp0qULzz77LIsWLaJz584A6Wll24oxcvLJJ/PEE0+UWWvJc0MIOzynrP7PP/982rVrx5QpU+jevTu///3vOemkkygsLGTq1Klcf/31dOvWrdQRqfXr1zNkyBBmz55NkyZNuPnmm1m/fv0Or6m0OqtVq5aegrjt31/Jezhx4kSWLl1KYWEh1atXJycnJ91fae127NiRRYsW8de//pVNmzbRvHnzHd6j78JnhiRJkpQxdevW3e75ly1WrVpF/fr1qV27Nh988AEzZ87c5f7WrFlD48aN2bBhAxMnTkzvP+CAA2jbti3Dhg3j9NNPJysriwMPPJCmTZvy1FNPAUW/7L/99ttl1nrooYcCRc/CbHH88cczefJkAN577z3effddANq3b8/rr7/Oxx9/DBQ9W/TRRx+V2vbRRx/NkiVLmDVrVvoatl1woKz+P/nkE37wgx9w5ZVX0rNnT9555x2WLFlC7dq16d+/P9dccw3/+Mc/Su13S3Bp2LAha9eu5emnnwaKRqYOO+wwnnvuOaBotGzdunV069aNcePGsW7dOoD0NLmcnBwKC4tWKdzSRln38Hvf+x7Vq1fn1Vdf5dNPPwWga9euTJ48meXLl2/VLsCFF15I3759GThwYJnt7gpHhiRJkpKknKWwd7cGDRrQsWNHmjdvTq1atTj44IPTx3r06MHo0aPJy8vjqKOOon379rvc36233kq7du044ogjyM3N3SqI9enTh969e6dHi6BotOKyyy7jtttuY8OGDfzkJz8hlUpt1+7Pf/5zLrroIkaNGsVJJ52U3j9kyBAuuugi8vLyaNmyJXl5edSrV49GjRoxfvx4+vbtm556d9ttt/GjH/1ou7Zr1KjBpEmTuOKKK/j666+pVasWBQUFFep/0qRJPPbYY1SvXp3vf//7jBw5klmzZnHttdey3377Ub16dR588MFS79VBBx3EoEGDyM3NJScnJz1ND2DChAlceumljBw5kurVq/PUU0/Ro0cP5syZQ5s2bahRowannnoqd9xxB9dccw3nnXceEyZM2Kq2bfXr148zzjiDNm3a0KJFC44++mgAmjVrxg033MCJJ55IVlYWLVu2TAe+fv36MWLECPr27Vtmu7silDUMtqdq06ZN3LJahSSpdJe+UDX9PnT8bn5/SUVV8i930t7k/fff55hjjqnqMvZZmzZtYsOGDdSsWZMFCxbQtWtXPvroI2rUqFHVpe0Tnn76aZ5//nkmTJhQ5jml/RsPIRTGGNuU174jQ5IkSdJ3tG7dOrp06cKGDRuIMfLggw8ahHaTK664ghdffJGpU6dmrA/DkCRJkvY6Q4cO5fXXX99q37BhwzL2bElZ6taty87MWjr77LNZuHDhVvvuuuuu9Kp3mVJV/e6K3/72txnvwzAkSZKkvc79999f1SV8J1uWEU9Kv3s6V5OTJEmSlEiGIUmSJEmJZBiSJEmSlEg+MyRJkpQgofDS3dpebP3QDo+vXLmSxx9/nCFDhux02/feey+DBw+mdu3a37U8aYccGZIkSVLGrFy5kgceeOA7fffee+9l3bp1u7mi72bjxo1VXYIywDAkSZKkjBk+fDgLFiygRYsWXHvttfzyl78kPz+fvLw8brrpJgC++uorTjvtNFKpFM2bN2fSpEncd999LFmyhC5dutClS5cy27/sssto06YNzZo1S7cHMGvWLI477jhSqRRt27ZlzZo1bNq0iWuuuYbc3Fzy8vLSSzfn5OSwbNkyAGbPnk3nzp0BuPnmmxk8eDDdunXjwgsvZNGiRXTq1IlWrVrRqlUr/v73v6f7u/vuu8nNzSWVSqWvuVWrVunj8+fPp3VrXxC9p3GanCRJkjLmzjvvZO7cucyZM4dp06bx9NNP89ZbbxFjpGfPnsyYMYOlS5dyyCGHMGXKFABWrVpFvXr1GDVqFK+++ioNGzYss/3bb7+d7OxsNm3aRNeuXXnnnXc4+uij6dOnD5MmTSI/P5/Vq1dTq1YtxowZw8KFC/nnP/9JtWrVWLFiRbn1FxYW8tprr1GrVi3WrVvHyy+/TM2aNZk/fz59+/Zl9uzZvPjiizz33HO8+eab1K5dmxUrVpCdnU29evWYM2cOLVq04JFHHmHAgAG767ZqNzEMSZIkqVJMmzaNadOm0bJlSwDWrl3L/Pnz6dSpE9dccw3XXXcdp59+Op06dapwm5MnT2bMmDFs3LiRf/3rX7z33nuEEGjcuDH5+fkAHHjggQAUFBTws5/9jGrVin4Fzs7OLrf9nj17UqtWLQA2bNjA5Zdfzpw5c8jKyuKjjz5Ktztw4MD0s01b2r3kkkt45JFHGDVqFJMmTeKtt96q8HWpchiGJEmSVClijFx//fVceun2izgUFhYydepUrr/+erp168bIkSPLbW/hwoXcc889zJo1i/r16zNgwADWr19PjJEQQqn9l7a/WrVqbN68GYD169dvdaxOnTrpz7/+9a85+OCDefvtt9m8eTM1a9bcYbu9evXiv/7rvzjppJNo3bo1DRo0KPeaVLl8ZkiSJEkZU7duXdasWQNA9+7dGTduHGvXrgXg888/59///jdLliyhdu3a9O/fn2uuuYZ//OMf2323NKtXr6ZOnTrUq1ePL774ghdffBGAo48+miVLljBr1iwA1qxZw8aNG+nWrRujR49OL4awZZpcTk4OhYWFADzzzDNl9rdq1SoaN27Mfvvtx4QJE9i0aRMA3bp1Y9y4cenFHra0W7NmTbp3785ll13GwIEDv8PdU6Y5MiRJkpQg5S2Fvbs1aNCAjh070rx5c0455RTOP/98OnToAMABBxzAY489xscff8y1117LfvvtR/Xq1XnwwQcBGDx4MKeccgqNGzfm1Vdf3a7tVCpFy5YtadasGT/4wQ/o2LEjADVq1GDSpElcccUVfP3119SqVYuCggIuueQSPvroI/Ly8qhevTqDBg3i8ssv56abbuLiiy/mjjvuoF27dmVey5AhQ+jVqxdPPfUUXbp0SY8a9ejRgzlz5tCmTRtq1KjBqaeeyh133AFAv379+J//+R+6deu2W++rdo8QY6zqGnZKmzZt4uzZs6u6DEnao136QtX0+9DxhVXTcX1XaJLK8v7773PMMcdUdRmJdc8997Bq1SpuvfXWqi5ln1Xav/EQQmGMsU1533VkSJIkScqAs88+mwULFvDKK69UdSkqg2FIkiRJe7x27drxzTffbLVvwoQJ5ObmVlFF5Xv22WerugSVwzAkSZKkPd6bb75Z1SVoH+RqcpIkSZISyTAkSZIkKZEMQ5IkSZISyTAkSZIkKZFcQEGSJClJXrh097Z3RuW+xFXanRwZkiRJUsasXLmSBx544Dt9995772XdunW7uaI9180338w999xT1WUkimFIkiRJGbM3hqFNmzZVep/7mo0bN1Z1CRViGJIkSVLGDB8+nAULFtCiRQuuvfZafvnLX5Kfn09eXh433XQTAF999RWnnXYaqVSK5s2bM2nSJO677z6WLFlCly5d6NKlS5ntX3bZZbRp04ZmzZql23vxxRc577zz0udMnz6dM844A4Bp06bRoUMHWrVqRe/evVm7di0AOTk53HLLLRx//PE89dRTjB07lvz8fFKpFL169UqHsgULFtC+fXvy8/MZOXIkBxxwQLqf0q6tLI8++ih5eXmkUikuuOCC7Y6X1f9TTz1F8+bNSaVSnHDCCQDMmzePtm3b0qJFC/Ly8pg/f36Z/Z511lm0bt2aZs2aMWbMmPT+P//5z7Rq1YpUKkXXrl0BWLt2LQMHDiQ3N5e8vDyeeeYZgK2u+emnn2bAgAEADBgwgKuvvpouXbpw3XXX8dZbb3HcccfRsmVLjjvuOD788EOgKGxec8016XZ/+9vf8pe//IWzzz473e7LL7/MOeecs8N7uDv4zJAkSZIy5s4772Tu3LnMmTOHadOm8fTTT/PWW28RY6Rnz57MmDGDpUuXcsghhzBlyhQAVq1aRb169Rg1ahSvvvoqDRs2LLP922+/nezsbDZt2kTXrl155513OPnkk7n00kv56quvqFOnDpMmTaJPnz4sW7aM2267jYKCAurUqcNdd93FqFGjGDlyJAA1a9bktddeA2D58uUMGjQIgBEjRvDwww9zxRVXMGzYMIYNG0bfvn0ZPXp0uo5p06Yxf/787a5tS2Apad68edx+++28/vrrNGzYkBUrVmx3zjnnnFNq/7fccgsvvfQShx56KCtXrgRg9OjRDBs2jH79+vHtt9/ucGRr3LhxZGdn8/XXX5Ofn0+vXr3YvHkzgwYNYsaMGTRt2jRdz6233kq9evV49913Afjyyy/LbHeLjz76iIKCArKysli9ejUzZsygWrVqFBQU8Itf/IJnnnmGMWPGsHDhQv75z39SrVo1VqxYQf369Rk6dChLly6lUaNGPPLIIwwcOLDc/naVI0OSJEmqFNOmTWPatGm0bNmSVq1a8cEHHzB//nxyc3MpKCjguuuu429/+xv16tWrcJuTJ0+mVatWtGzZknnz5vHee+9RrVo1evTowQsvvMDGjRuZMmUKZ555JjNnzuS9996jY8eOtGjRgj/84Q98+umn6bb69OmT/jx37lw6depEbm4uEydOZN68eQC88cYb9O7dG4Dzzz+/3GsrzSuvvMK5556bDnnZ2dnbnVNW/x07dmTAgAGMHTs2HXo6dOjAHXfcwV133cWnn35KrVq1yrxf9913H6lUivbt2/PZZ58xf/58Zs6cyQknnEDTpk23qqegoICRfGo6AAAgAElEQVShQ4emv1u/fv0y292id+/eZGVlAUWhtnfv3jRv3pyrrroqfQ0FBQX87Gc/o1q1aun+QghccMEFPPbYY6xcuZI33niDU045pdz+dpUjQ9Ie5NIXKr/Ph86o/D4lSckUY+T666/n0ku3X9GusLCQqVOncv3119OtW7f0aM2OLFy4kHvuuYdZs2ZRv359BgwYwPr164GiYHP//feTnZ1Nfn4+devWJcbIySefzBNPPFFqe3Xq1El/HjBgAM899xypVIrx48czffr073xtpZ0bQtjhOWX1P3r0aN58802mTJlCixYtmDNnDueffz7t2rVjypQpdO/end///vecdNJJ27U5ffp0CgoKeOONN6hduzadO3dm/fr1ZdZT1v6S+7bc7y1K3sMbb7yRLl268Oyzz7Jo0SI6d+68w3YHDhzIGWecQc2aNendu3c6LGWSYUiSJClJKnkp7Lp167JmzRoAunfvzo033ki/fv044IAD+Pzzz6levTobN24kOzub/v37c8ABBzB+/PitvlvWNLnVq1dTp04d6tWrxxdffMGLL76Y/oW7c+fOXHzxxYwdOzY94tO+fXuGDh3Kxx9/zA9/+EPWrVvH4sWL+dGPfrRd22vWrKFx48Zs2LCBiRMncuihh6bbeOaZZ+jTpw9PPvlk+vyyru173/vedm137dqVs88+m6uuuooGDRqwYsWK7UaHyup/wYIFtGvXjnbt2vHCCy/w2WefsWrVKn7wgx9w5ZVX8sknn/DOO++UGoZWrVpF/fr1qV27Nh988AEzZ84EikaWhg4dysKFC9PT5LKzs+nWrRu/+93vuPfee4GiaXL169fn4IMP5v333+eoo47i2WefpW7duqX+/axa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\n",
      "text/plain": [
       "<Figure size 1008x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#refer to https://matplotlib.org/3.1.0/gallery/units/bar_unit_demo.html\n",
    "#refer to https://stackoverflow.com/questions/53342170/matplotlib-plot-multiple-bars-in-one-graph\n",
    "% matplotlib inline\n",
    "fig, axes = plt.subplots(figsize=(14,7))\n",
    "ind = np.arange(len(accuracy)) \n",
    "# the width of the bars\n",
    "width = 0.2         \n",
    "p1 = axes.bar(ind, accuracy['train_accuracy'], data=accuracy,width=0.2,color='#66B2FF')\n",
    "p2 = axes.bar(ind+width, accuracy['train_average_class_accuracy'], data=accuracy,width=0.2,color='#FFEECC')\n",
    "p3 = axes.bar(ind+(width*2), accuracy['test_accuracy'], data=accuracy,width=0.2,color='#00CC66')\n",
    "p4 = axes.bar(ind+(width*3), accuracy['test_average_class_accuracy'], data=accuracy,width=0.2,color='#FFB266')\n",
    "axes.set_xticklabels(accuracy.index)\n",
    "axes.set_xticks(ind + width + width/2)\n",
    "axes.set_ylabel('Accuracy score')\n",
    "axes.set_xlabel('Algorithm')\n",
    "axes.set_title('Accuracy Compare')\n",
    "axes.xaxis.set_tick_params(rotation=45)\n",
    "axes.legend((p1[0], p2[0],p3[0],p4[0]), ('train_accuracy', 'train_average_class_accuracy','test_accuracy','test_average_class_accuracy'))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Result Disscussion**:\n",
    "The MLPClassifier algorithm acheived the highest accuracy on test data.\n",
    "But the DecisionTreeClassifier algorithm worked best at the prediction on the train data for both accuracy and average class accuracy. Also, it worked best for the average class accuracy on the test data.\n",
    "And, GussianNB algorithm worked worst on this dataset for both train data and test data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Choose one of the ML algorithms and plot one line chart to show how the variation of one parameter of the selected ML algorithm affects the average class accuracy on the validation set (accuracy vs parameter). **"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "metadata": {},
   "outputs": [],
   "source": [
    "#choose KNeighborsClassifier algorithm and its n_neighbors parameter\n",
    "k = [3,5,10,15,20,25,50,100]\n",
    "acc_vs_p =[]\n",
    "for i in k:\n",
    "    knca = KNeighborsClassifier(n_neighbors=i)\n",
    "    knca.fit(X_train,y_train)\n",
    "    predictions = knca.predict(X_test)\n",
    "    acc_vs_p.append(average_class_accuracy(y_test, predictions))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 242,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Accuracy vs the n_neighbors parameter of KNeighborsClassifier')"
      ]
     },
     "execution_count": 242,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(12,5))\n",
    "plt.plot(k,acc_vs_p,'go-', linewidth=2, markersize=7,markerfacecolor='#CCCC00',markeredgecolor='#CCCC00')\n",
    "plt.xlabel('n_neighbors')\n",
    "plt.ylabel('average class accuracy')\n",
    "plt.title('Accuracy vs the n_neighbors parameter of KNeighborsClassifier')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**From the algorithms you tested, select the one you believe is the best for this task, justify and try to achieve the best performance possible over your validation set. Report your best result (average class accuracy). Explain any decisions you consider relevant during the training of your ML model. You may try to do changes to your pre-processing (including the imputation of the first assignment or columns transformations performed here) and/or tune the hyper parameters of your model. Describe the steps you have taken to find the configuration that yields the best result.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "The numbers of samples with salary '>50K' is much smaller than the samples with salary '<=50K', so the accuracy of predicting the data with salary '>50K' is very low. Adding more samples with salary '>50K' can increase the accuracy of predicting these data.<br/>\n",
    "\n",
    "The steps:<br/>\n",
    "1. check the numbers of different values of salary column,the number of samples with salary '<=50K' \n",
    "   is 21764, with salary '>50K' is only 7194<br/>\n",
    "2. compare the accuraies of predicting these two different values. The accuracy of predicting the \n",
    "   sample with '<=50K' is 0.97, the other with '>50K' is 0.265. <br/>\n",
    "3. add the same samples with '>50K' to the whole dataset to make the balance of two different values.<br/>\n",
    "4. run the algorithm to compare the accuracy with the previous dataset<br/>\n",
    "5. the average class accuracy improves from 0.62 to 0.79<br/>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 243,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<=50K    21764\n",
       ">50K      7194\n",
       "Name: salary, dtype: int64"
      ]
     },
     "execution_count": 243,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "persons['salary'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 244,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "less50class_accuracy:  0.9263061130687912\n",
      "greater50class_accuracy:  0.5812124016658954\n",
      "average_class_accuracy:  0.7537592573673433\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\lanch\\Anaconda3\\lib\\site-packages\\sklearn\\neural_network\\multilayer_perceptron.py:566: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.\n",
      "  % self.max_iter, ConvergenceWarning)\n"
     ]
    }
   ],
   "source": [
    "MLPC = MLPClassifier()\n",
    "MLPC.fit(X_train,y_train)\n",
    "prediction = MLPC.predict(X_test)\n",
    "cm = confusion_matrix(y_test, prediction, labels=['<=50K','>50K'])\n",
    "tp = cm[0][0]\n",
    "tn = cm[1][1]\n",
    "less50class = np.sum(cm[0])\n",
    "greater50class = np.sum(cm[1])\n",
    "less50class_accuracy = tp/less50class\n",
    "greater50class_accuracy = tn/greater50class\n",
    "average_class_accuracy = (less50class_accuracy+greater50class_accuracy)/2\n",
    "print('less50class_accuracy: ',less50class_accuracy)\n",
    "print('greater50class_accuracy: ',greater50class_accuracy)\n",
    "print('average_class_accuracy: ',average_class_accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 245,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<=50K    21764\n",
       ">50K     21582\n",
       "Name: salary, dtype: int64"
      ]
     },
     "execution_count": 245,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#adding more samples with salary '>50K' to the dataset\n",
    "data_complete = data_normalize\n",
    "data_complete['salary'] = persons['salary']\n",
    "data_complete.head()\n",
    "data_greater50K = data_complete[data_complete['salary'] == '>50K']\n",
    "data1 = data_complete.append(data_greater50K)\n",
    "data_new = data1.append(data_greater50K)\n",
    "data_new['salary'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 246,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = data_new.loc[:, data_new.columns != 'salary']\n",
    "y = data_new['salary']\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 247,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "less50class_accuracy:  0.8093415007656968\n",
      "greater50class_accuracy:  0.8456904541241891\n",
      "average_class_accuracy:  0.827515977444943\n"
     ]
    }
   ],
   "source": [
    "# calculate the accuracy of the model prediction after renew the dataset \n",
    "MLPC = MLPClassifier()\n",
    "MLPC.fit(X_train,y_train)\n",
    "prediction = MLPC.predict(X_test)\n",
    "cm = confusion_matrix(y_test, prediction, labels=['<=50K','>50K'])\n",
    "tp = cm[0][0]\n",
    "tn = cm[1][1]\n",
    "less50class = np.sum(cm[0])\n",
    "greater50class = np.sum(cm[1])\n",
    "less50class_accuracy = tp/less50class\n",
    "greater50class_accuracy = tn/greater50class\n",
    "average_class_accuracy = (less50class_accuracy+greater50class_accuracy)/2\n",
    "print('less50class_accuracy: ',less50class_accuracy)\n",
    "print('greater50class_accuracy: ',greater50class_accuracy)\n",
    "print('average_class_accuracy: ',average_class_accuracy)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Using your best model, predict the classes for the profiles provided in the test file dataset1_test.csv and generate an output file (submit as ​B00XXXXXX ​ _prediction.csv​) containing only the predicted class for each row. One entry class per line, e.g., **"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 268,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>education-num</th>\n",
       "      <th>marital-status</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>native-country</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>25</td>\n",
       "      <td>Private</td>\n",
       "      <td>226802</td>\n",
       "      <td>11th</td>\n",
       "      <td>7</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Machine-op-inspct</td>\n",
       "      <td>Own-child</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>38</td>\n",
       "      <td>Private</td>\n",
       "      <td>89814</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>9</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Farming-fishing</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>50</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>28</td>\n",
       "      <td>Local-gov</td>\n",
       "      <td>336951</td>\n",
       "      <td>Assoc-acdm</td>\n",
       "      <td>12</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Protective-serv</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>44</td>\n",
       "      <td>Private</td>\n",
       "      <td>160323</td>\n",
       "      <td>Some-college</td>\n",
       "      <td>10</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Machine-op-inspct</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>7688</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>34</td>\n",
       "      <td>Private</td>\n",
       "      <td>198693</td>\n",
       "      <td>10th</td>\n",
       "      <td>6</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Other-service</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>30</td>\n",
       "      <td>United-States</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  workclass  fnlwgt     education  education-num      marital-status  \\\n",
       "0   25    Private  226802          11th              7       Never-married   \n",
       "1   38    Private   89814       HS-grad              9  Married-civ-spouse   \n",
       "2   28  Local-gov  336951    Assoc-acdm             12  Married-civ-spouse   \n",
       "3   44    Private  160323  Some-college             10  Married-civ-spouse   \n",
       "4   34    Private  198693          10th              6       Never-married   \n",
       "\n",
       "          occupation   relationship   race   sex  capital-gain  capital-loss  \\\n",
       "0  Machine-op-inspct      Own-child  Black  Male             0             0   \n",
       "1    Farming-fishing        Husband  White  Male             0             0   \n",
       "2    Protective-serv        Husband  White  Male             0             0   \n",
       "3  Machine-op-inspct        Husband  Black  Male          7688             0   \n",
       "4      Other-service  Not-in-family  White  Male             0             0   \n",
       "\n",
       "   hours-per-week native-country  \n",
       "0              40  United-States  \n",
       "1              50  United-States  \n",
       "2              40  United-States  \n",
       "3              40  United-States  \n",
       "4              30  United-States  "
      ]
     },
     "execution_count": 268,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# define the name of headers\n",
    "col_name = ['age','workclass','fnlwgt','education','education-num','marital-status','occupation','relationship','race','sex','capital-gain','capital-loss','hours-per-week','native-country']\n",
    "# read the test data from csv file\n",
    "test_data = pd.read_csv('dataset1_test.csv',header=None,names = col_name)\n",
    "test_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 270,
   "metadata": {},
   "outputs": [],
   "source": [
    "#convert categorical columns into multiple binary or numerical columns\n",
    "edu = pd.Categorical(test_data['education'],categories=['Preschool','1st-4th','5th-6th','7th-8th','9th','10th','11th','12th','HS-grad','Prof-school','Assoc-acdm','Assoc-voc','Some-college','Bachelors','Masters','Doctorate'],ordered=True)\n",
    "labels, unique = pd.factorize(edu, sort=True)\n",
    "test_data['education'] = labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 271,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_dummies = pd.get_dummies(test_data, prefix_sep='_', drop_first=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>education-num</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>workclass_Local-gov</th>\n",
       "      <th>workclass_Private</th>\n",
       "      <th>workclass_Self-emp-inc</th>\n",
       "      <th>...</th>\n",
       "      <th>native-country_Portugal</th>\n",
       "      <th>native-country_Puerto-Rico</th>\n",
       "      <th>native-country_Scotland</th>\n",
       "      <th>native-country_South</th>\n",
       "      <th>native-country_Taiwan</th>\n",
       "      <th>native-country_Thailand</th>\n",
       "      <th>native-country_Trinadad&amp;Tobago</th>\n",
       "      <th>native-country_United-States</th>\n",
       "      <th>native-country_Vietnam</th>\n",
       "      <th>native-country_Yugoslavia</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>25</td>\n",
       "      <td>226802</td>\n",
       "      <td>6</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>38</td>\n",
       "      <td>89814</td>\n",
       "      <td>8</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>50</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>28</td>\n",
       "      <td>336951</td>\n",
       "      <td>10</td>\n",
       "      <td>12</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>44</td>\n",
       "      <td>160323</td>\n",
       "      <td>12</td>\n",
       "      <td>10</td>\n",
       "      <td>7688</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>34</td>\n",
       "      <td>198693</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>30</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 81 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  fnlwgt  education  education-num  capital-gain  capital-loss  \\\n",
       "0   25  226802          6              7             0             0   \n",
       "1   38   89814          8              9             0             0   \n",
       "2   28  336951         10             12             0             0   \n",
       "3   44  160323         12             10          7688             0   \n",
       "4   34  198693          5              6             0             0   \n",
       "\n",
       "   hours-per-week  workclass_Local-gov  workclass_Private  \\\n",
       "0              40                    0                  1   \n",
       "1              50                    0                  1   \n",
       "2              40                    1                  0   \n",
       "3              40                    0                  1   \n",
       "4              30                    0                  1   \n",
       "\n",
       "   workclass_Self-emp-inc  ...  native-country_Portugal  \\\n",
       "0                       0  ...                        0   \n",
       "1                       0  ...                        0   \n",
       "2                       0  ...                        0   \n",
       "3                       0  ...                        0   \n",
       "4                       0  ...                        0   \n",
       "\n",
       "   native-country_Puerto-Rico  native-country_Scotland  native-country_South  \\\n",
       "0                           0                        0                     0   \n",
       "1                           0                        0                     0   \n",
       "2                           0                        0                     0   \n",
       "3                           0                        0                     0   \n",
       "4                           0                        0                     0   \n",
       "\n",
       "   native-country_Taiwan  native-country_Thailand  \\\n",
       "0                      0                        0   \n",
       "1                      0                        0   \n",
       "2                      0                        0   \n",
       "3                      0                        0   \n",
       "4                      0                        0   \n",
       "\n",
       "   native-country_Trinadad&Tobago  native-country_United-States  \\\n",
       "0                               0                             1   \n",
       "1                               0                             1   \n",
       "2                               0                             1   \n",
       "3                               0                             1   \n",
       "4                               0                             1   \n",
       "\n",
       "   native-country_Vietnam  native-country_Yugoslavia  \n",
       "0                       0                          0  \n",
       "1                       0                          0  \n",
       "2                       0                          0  \n",
       "3                       0                          0  \n",
       "4                       0                          0  \n",
       "\n",
       "[5 rows x 81 columns]"
      ]
     },
     "execution_count": 272,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_dummies.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 273,
   "metadata": {},
   "outputs": [],
   "source": [
    "# retrive all the numerical columns\n",
    "data_numerical = data_dummies[['age','fnlwgt','education','education-num','capital-gain','capital-loss','hours-per-week']]\n",
    "data_normalize = data_dummies\n",
    "# normalize every numerical columns in for loop using normalize() method\n",
    "for col in data_numerical.columns:\n",
    "    x = np.array(data_numerical[col])\n",
    "    y = normalize([x]) \n",
    "    data_normalize[col] = y[0].tolist()   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 274,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>education-num</th>\n",
       "      <th>capital-gain</th>\n",
       "      <th>capital-loss</th>\n",
       "      <th>hours-per-week</th>\n",
       "      <th>workclass_Local-gov</th>\n",
       "      <th>workclass_Private</th>\n",
       "      <th>workclass_Self-emp-inc</th>\n",
       "      <th>...</th>\n",
       "      <th>native-country_Portugal</th>\n",
       "      <th>native-country_Puerto-Rico</th>\n",
       "      <th>native-country_Scotland</th>\n",
       "      <th>native-country_South</th>\n",
       "      <th>native-country_Taiwan</th>\n",
       "      <th>native-country_Thailand</th>\n",
       "      <th>native-country_Trinadad&amp;Tobago</th>\n",
       "      <th>native-country_United-States</th>\n",
       "      <th>native-country_Vietnam</th>\n",
       "      <th>native-country_Yugoslavia</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.004967</td>\n",
       "      <td>0.008515</td>\n",
       "      <td>0.004722</td>\n",
       "      <td>0.005468</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.007635</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.007550</td>\n",
       "      <td>0.003372</td>\n",
       "      <td>0.006296</td>\n",
       "      <td>0.007031</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.009544</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.005563</td>\n",
       "      <td>0.012650</td>\n",
       "      <td>0.007870</td>\n",
       "      <td>0.009374</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.007635</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.008742</td>\n",
       "      <td>0.006019</td>\n",
       "      <td>0.009444</td>\n",
       "      <td>0.007812</td>\n",
       "      <td>0.008048</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.007635</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.006755</td>\n",
       "      <td>0.007460</td>\n",
       "      <td>0.003935</td>\n",
       "      <td>0.004687</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.005726</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 81 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        age    fnlwgt  education  education-num  capital-gain  capital-loss  \\\n",
       "0  0.004967  0.008515   0.004722       0.005468      0.000000           0.0   \n",
       "1  0.007550  0.003372   0.006296       0.007031      0.000000           0.0   \n",
       "2  0.005563  0.012650   0.007870       0.009374      0.000000           0.0   \n",
       "3  0.008742  0.006019   0.009444       0.007812      0.008048           0.0   \n",
       "4  0.006755  0.007460   0.003935       0.004687      0.000000           0.0   \n",
       "\n",
       "   hours-per-week  workclass_Local-gov  workclass_Private  \\\n",
       "0        0.007635                    0                  1   \n",
       "1        0.009544                    0                  1   \n",
       "2        0.007635                    1                  0   \n",
       "3        0.007635                    0                  1   \n",
       "4        0.005726                    0                  1   \n",
       "\n",
       "   workclass_Self-emp-inc  ...  native-country_Portugal  \\\n",
       "0                       0  ...                        0   \n",
       "1                       0  ...                        0   \n",
       "2                       0  ...                        0   \n",
       "3                       0  ...                        0   \n",
       "4                       0  ...                        0   \n",
       "\n",
       "   native-country_Puerto-Rico  native-country_Scotland  native-country_South  \\\n",
       "0                           0                        0                     0   \n",
       "1                           0                        0                     0   \n",
       "2                           0                        0                     0   \n",
       "3                           0                        0                     0   \n",
       "4                           0                        0                     0   \n",
       "\n",
       "   native-country_Taiwan  native-country_Thailand  \\\n",
       "0                      0                        0   \n",
       "1                      0                        0   \n",
       "2                      0                        0   \n",
       "3                      0                        0   \n",
       "4                      0                        0   \n",
       "\n",
       "   native-country_Trinadad&Tobago  native-country_United-States  \\\n",
       "0                               0                             1   \n",
       "1                               0                             1   \n",
       "2                               0                             1   \n",
       "3                               0                             1   \n",
       "4                               0                             1   \n",
       "\n",
       "   native-country_Vietnam  native-country_Yugoslavia  \n",
       "0                       0                          0  \n",
       "1                       0                          0  \n",
       "2                       0                          0  \n",
       "3                       0                          0  \n",
       "4                       0                          0  \n",
       "\n",
       "[5 rows x 81 columns]"
      ]
     },
     "execution_count": 274,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_normalize.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 275,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['native-country_Holand-Netherlands'], dtype='object')"
      ]
     },
     "execution_count": 275,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# there is one column missing in the normolized test dataset comparing to the training data\n",
    "# need to find out the column and add it to the test dataset\n",
    "c1=data_normalize.columns\n",
    "c2=X.columns\n",
    "not_test_col = c2.difference(c1)\n",
    "not_test_col"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 276,
   "metadata": {},
   "outputs": [],
   "source": [
    "# test data missing one column 'native-country_Holand-Netherlands', add it back\n",
    "data_normalize['native-country_Holand-Netherlands'] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 278,
   "metadata": {},
   "outputs": [],
   "source": [
    "#use the best model to predict the value\n",
    "prediction = MLPC.predict(data_normalize)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 280,
   "metadata": {},
   "outputs": [],
   "source": [
    "# change the result array to dataframe in order to save to the file 'B00809814_prediction.csv'\n",
    "predict_data = pd.DataFrame(prediction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 282,
   "metadata": {},
   "outputs": [],
   "source": [
    "predict_data.to_csv('B00809814_prediction.csv',index=False,header=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
